package com.lzq.framework.util;

import org.apache.commons.lang3.StringUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

/**
 * 
 * @description BigDecimal工具类
 * @author leieb
 * @time 2017年9月6日 下午2:39:30
 *
 */
@SuppressWarnings("unused")
public class BigDecimalUtil {

	private final static double CURRENCY_H = 100.00;
	private final static double CURRENCY_MALTIPLE = 10000.00;
	private final static DecimalFormat CURRENCY_FORMAT = new DecimalFormat("##,###.00");
	// 多余0去掉
	private final static DecimalFormat CURRENCY_FORMAT_2 = new DecimalFormat("##,###.##");
	// 多余0去掉
	private final static DecimalFormat CURRENCY_FORMAT_3 = new DecimalFormat("#.##");
	private final static DecimalFormat DEFAULT_FORMAT_2 = new DecimalFormat("0.00");
	private final static DecimalFormat PERCENT_FORMAT = new DecimalFormat("#.##%");

	public static BigDecimal getTwoDecimals(BigDecimal b) {
		return b.setScale(2, RoundingMode.DOWN);
	}

	/**
	 * 保留两位小数，四舍五入
	 * 
	 * @param currency
	 * @return
	 */
	public static String getBigDecimal(BigDecimal currency) {
		if (currency == null) {
			return "0.00";
		}
		if (currency.compareTo(new BigDecimal("0")) == 0) {
			return "0.00";
		}
		if (currency.compareTo(new BigDecimal(0)) == 1 && currency.compareTo(new BigDecimal(1)) == -1) {
			return DEFAULT_FORMAT_2.format(currency);
		}
		return CURRENCY_FORMAT.format(currency);
	}

	/**
	 * 根据出入的位数进行舍取 如果currentcy为null则输出0.00
	 * 
	 * @param currentcy
	 * @param scale
	 */
	public static BigDecimal setScale(BigDecimal currentcy, int scale) {
		if (currentcy == null) {
			return new BigDecimal("0.00");
		}
		return currentcy.setScale(scale, BigDecimal.ROUND_DOWN);
	}

	/**
	 * 保留两位小数 采用round_down模式
	 * 
	 * @param value
	 * @return
	 */
	public static String getRundDownStr(double value) {
		BigDecimal v = new BigDecimal(String.valueOf(value));
		BigDecimal v1 = v.setScale(2, BigDecimal.ROUND_DOWN);
		return v1.toString();
	}

	/**
	 * 除以1万，转换为元，默认格式 传入long值，除1万，保留两位小数 采用round_down模式。 例如 500 --- 0.05 50000
	 * --- 5.00
	 * 
	 * @param amount
	 * @return
	 */
	public static String format(String amount) {
		if (StringUtils.isEmpty(amount)) {
			return "0.00";
		}

		long currency = Long.valueOf(amount);

		if (currency == 0) {
			return "0.00";
		} else {
			double number = getRundDownValue(currency / CURRENCY_MALTIPLE);
			if (number > -1.00 && number < 1.00) {
				return DEFAULT_FORMAT_2.format(number);
			} else {
				return CURRENCY_FORMAT.format(number);
			}
		}
	}

	public static String formatDoubleToString(Double amount) {
		if (null == amount) {
			return "0.00";
		}
		return DEFAULT_FORMAT_2.format(amount);
	}

	/**
	 * 格式化钱，取整 例如33,333.01 -- 33333
	 * 
	 * @return
	 */
	public static String formatMoneyString(String str) {

		if (StringUtils.isEmpty(str)) {
			return str;
		}
		String str2 = str.replaceAll(",", "");
		int index = str2.indexOf(".");
		if (index != -1) {
			return str2.substring(0, index);
		}

		return str2;
	}

	/**
	 * @Descrption:保留两位小数，最后一位为0也要保留，四舍五入
	 * @Author:wx
	 * @date:2015年7月29日
	 * @param value
	 * @return
	 */
	public static String roundDouble(double value) {
		DecimalFormat df = new DecimalFormat("0.00");
		return df.format(value);
	}

	/**
	 * 保留两位小数 采用round_down模式
	 * 
	 * @param value
	 * @return double
	 */
	public static double getRundDownValue(double value) {
		BigDecimal v = new BigDecimal(String.valueOf(value));
		BigDecimal v1 = v.setScale(2, BigDecimal.ROUND_DOWN);
		return v1.doubleValue();
	}

	/**
	 * 加息利率取出末尾0
	 * 
	 * @param num
	 * @return
	 */
	public static String plainString(BigDecimal num) {
		if (num == null) {
			num = new BigDecimal("0");
		}
		return BigDecimal.valueOf(num.doubleValue()).stripTrailingZeros().toPlainString();
	}

	/**
	 * 保留2位小数舍去尾部0
	 * @param bigDecimal 原始数据
	 * @return 保留2位小数且舍去尾部0
	 */
	public static BigDecimal keepTwoStripTrailingZeros(BigDecimal bigDecimal){
		if (bigDecimal == null) {
			bigDecimal = new BigDecimal("0");
		}
        String string = getTwoDecimals(bigDecimal).stripTrailingZeros().toPlainString();
        return new BigDecimal(string);
	}
	/**
	 * 保留两位小数
	 * @param amount
	 * @return
	 * @since:2017年11月29日
	 * @author:liuxc
	 */
	public static String keepTwoDecimal(String amount) {
		BigDecimal twoDecimal  = new BigDecimal(amount).setScale(2, BigDecimal.ROUND_DOWN);
		return twoDecimal.toString();
	}

	/**
	 * 保留2位小数 后面小数直接舍弃
	 * 如 3.146 > 3.14
	 * @param bigDecimal
	 * @return
	 */
	public static String keepTwoDecimal(BigDecimal bigDecimal){
		if(null == bigDecimal){
			return "0.00";
		}
		BigDecimal twoDecimals = getTwoDecimals(bigDecimal);
		return twoDecimals.toString();
	}
}
